/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package service;

import entity.Card;
import entity.CardFacadeLocal;
import entity.Payment;
import entity.PaymentFacadeLocal;
import java.math.BigDecimal;
import java.util.Date;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.jws.WebMethod;
import javax.jws.WebService;

/**
 *
 * @author SONY
 */
@WebService()
@Stateless()
public class PaymentWebService {
    
    @EJB CardFacadeLocal cardFacadeLocal;
    @EJB PaymentFacadeLocal paymentFacadeLocal;

    /**
     * This is a sample web service operation
     */
    @WebMethod
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public String pay(int oid, String cardnum, String cardholder, double totalprice) {
        BigDecimal total = new BigDecimal(totalprice);
        Date currentDate = new Date();
        try {
            Card card = cardFacadeLocal.find(cardnum);
            if(card != null) { //ktra mã số thẻ
                if(!card.getCardHolder().equals(cardholder)) { //ktra tên chủ thẻ
                    return "Tên Chủ Thẻ không đúng với dữ liệu đã lưu.";
                } else if(card.getExpDate().compareTo(currentDate) < 0) { //ktra ngày hết hạn của thẻ
                    return "Credit Card này đã hết hạn.";
                } else if(card.getBalance().compareTo(total) < 0) { //ktra số dư tiền trong tài khoản của thẻ
                    return "Số dư hiện tại không đủ để thanh toán.";
                } else {
                    //cập nhật lại số dư trong tài khoản
                    double current_balance = card.getBalance().doubleValue() - totalprice;
                    card.setBalance(new BigDecimal(current_balance));
                    cardFacadeLocal.edit(card);
                    
                    //insert dữ liệu vào bảng payment
                    Payment payment = new Payment();
                    payment.setOrderID(oid);
                    payment.setCardNumber(card);
                    payment.setPaymentDate(currentDate);
                    payment.setTotalPrice(total);
                    paymentFacadeLocal.create(payment);
                    
                    return "Thanh toán thành công.";
                }
            } else {
                return "Số Thẻ không đúng với dữ liệu đã lưu.";
            }
        } catch(Exception e) {
            System.err.println(e);  
            return "Thanh toán thất bại."; 
        }
    }
    
    @WebMethod
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public boolean deletePayment_updateBalance(int oid, String cardnum, double totalprice) {
        try {
            //xóa payment
            Payment payment = paymentFacadeLocal.find(oid);
            paymentFacadeLocal.remove(payment);
            
            //cập nhật balance
            Card card = cardFacadeLocal.find(cardnum);
            double balance = card.getBalance().doubleValue() + totalprice;
            card.setBalance(new BigDecimal(balance));
            cardFacadeLocal.edit(card);
            
            return true;
        } catch(Exception e) {
            System.err.println(e);
        }
        return false;
    }
}
